home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / kriegspi / xscreen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-06-30  |  10.0 KB  |  401 lines

  1. #ifndef lint
  2. static char rcsid[] = "$Header: xscreen.c,v 1.7 87/05/19 18:46:22 schoch Exp $";
  3. #endif
  4.  
  5. #include "externs.h"
  6.  
  7. static Pixmap white, black;
  8. static FontInfo info;
  9.  
  10. #define tile_width 64
  11. #define tile_height 64
  12. static short white_bits[] = {
  13.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  14.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  15.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  16.    0x7777, 0x7777, 0x7777, 0x7777,
  17.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  18.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  19.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  20.    0x7777, 0x7777, 0x7777, 0x7777,
  21.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  22.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  23.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  24.    0x7777, 0x7777, 0x7777, 0x7777,
  25.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  26.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  27.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  28.    0x7777, 0x7777, 0x7777, 0x7777,
  29.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  30.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  31.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  32.    0x7777, 0x7777, 0x7777, 0x7777,
  33.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  34.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  35.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  36.    0x7777, 0x7777, 0x7777, 0x7777,
  37.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  38.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  39.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  40.    0x7777, 0x7777, 0x7777, 0x7777,
  41.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  42.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  43.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  44.    0x7777, 0x7777, 0x7777, 0x7777,
  45.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  46.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  47.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  48.    0x7777, 0x7777, 0x7777, 0x7777,
  49.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  50.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  51.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  52.    0x7777, 0x7777, 0x7777, 0x7777,
  53.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  54.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  55.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  56.    0x7777, 0x7777, 0x7777, 0x7777,
  57.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  58.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  59.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  60.    0x7777, 0x7777, 0x7777, 0x7777,
  61.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  62.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  63.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  64.    0x7777, 0x7777, 0x7777, 0x7777,
  65.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  66.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  67.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  68.    0x7777, 0x7777, 0x7777, 0x7777,
  69.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  70.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  71.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  72.    0x7777, 0x7777, 0x7777, 0x7777,
  73.    0xdddd, 0xdddd, 0xdddd, 0xdddd,
  74.    0xeeee, 0xeeee, 0xeeee, 0xeeee,
  75.    0xbbbb, 0xbbbb, 0xbbbb, 0xbbbb,
  76.    0x7777, 0x7777, 0x7777, 0x7777};
  77.  
  78. static short black_bits[] = {
  79.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  80.    0x5555, 0x5555, 0x5555, 0x5555,
  81.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  82.    0x5555, 0x5555, 0x5555, 0x5555,
  83.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  84.    0x5555, 0x5555, 0x5555, 0x5555,
  85.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  86.    0x5555, 0x5555, 0x5555, 0x5555,
  87.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  88.    0x5555, 0x5555, 0x5555, 0x5555,
  89.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  90.    0x5555, 0x5555, 0x5555, 0x5555,
  91.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  92.    0x5555, 0x5555, 0x5555, 0x5555,
  93.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  94.    0x5555, 0x5555, 0x5555, 0x5555,
  95.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  96.    0x5555, 0x5555, 0x5555, 0x5555,
  97.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  98.    0x5555, 0x5555, 0x5555, 0x5555,
  99.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  100.    0x5555, 0x5555, 0x5555, 0x5555,
  101.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  102.    0x5555, 0x5555, 0x5555, 0x5555,
  103.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  104.    0x5555, 0x5555, 0x5555, 0x5555,
  105.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  106.    0x5555, 0x5555, 0x5555, 0x5555,
  107.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  108.    0x5555, 0x5555, 0x5555, 0x5555,
  109.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  110.    0x5555, 0x5555, 0x5555, 0x5555,
  111.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  112.    0x5555, 0x5555, 0x5555, 0x5555,
  113.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  114.    0x5555, 0x5555, 0x5555, 0x5555,
  115.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  116.    0x5555, 0x5555, 0x5555, 0x5555,
  117.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  118.    0x5555, 0x5555, 0x5555, 0x5555,
  119.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  120.    0x5555, 0x5555, 0x5555, 0x5555,
  121.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  122.    0x5555, 0x5555, 0x5555, 0x5555,
  123.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  124.    0x5555, 0x5555, 0x5555, 0x5555,
  125.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  126.    0x5555, 0x5555, 0x5555, 0x5555,
  127.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  128.    0x5555, 0x5555, 0x5555, 0x5555,
  129.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  130.    0x5555, 0x5555, 0x5555, 0x5555,
  131.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  132.    0x5555, 0x5555, 0x5555, 0x5555,
  133.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  134.    0x5555, 0x5555, 0x5555, 0x5555,
  135.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  136.    0x5555, 0x5555, 0x5555, 0x5555,
  137.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  138.    0x5555, 0x5555, 0x5555, 0x5555,
  139.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  140.    0x5555, 0x5555, 0x5555, 0x5555,
  141.    0xaaaa, 0xaaaa, 0xaaaa, 0xaaaa,
  142.    0x5555, 0x5555, 0x5555, 0x5555};
  143.  
  144.  
  145. screen_init()
  146. {
  147.     Bitmap bm;
  148.  
  149.     bm = XStoreBitmap(tile_width, tile_height, white_bits);
  150.     white = XMakePixmap(bm, WhitePixel, BlackPixel);
  151.     XFreeBitmap(bm);
  152.     bm = XStoreBitmap(tile_width, tile_height, black_bits);
  153.     black = XMakePixmap(bm, WhitePixel, BlackPixel);
  154.     XFreeBitmap(bm);
  155.     XQueryFont(font, &info);
  156. }
  157.  
  158. redraw()
  159. {
  160.     int i, j;
  161.     Pixmap tile;
  162.  
  163.     for (i = 0; i <= 8; i++)
  164.     XLine(window, i*64, TOPSPACE, i*64, 64*8+TOPSPACE,
  165.         1, 1, BlackPixel, GXcopy, 1);
  166.     for (i = 0; i <= 8; i++)
  167.     XLine(window, 0, i*64+TOPSPACE, 64*8, i*64+TOPSPACE,
  168.         1, 1, BlackPixel, GXcopy, 1);
  169.     for (i = 0; i < 8; i++)
  170.     for (j = 0; j < 8; j++) {
  171.         if ((i + j) & 1)
  172.         tile = black;
  173.         else
  174.         tile = white;
  175.         XPixmapPut(window, 1, 1, i*64+1, j*64+1+TOPSPACE, 63, 63, tile, GXcopy, 1);
  176.     }
  177.     redraw_pieces();
  178.     redraw_message(0);
  179.     XFlush();
  180. }
  181.  
  182. redraw_region(x, y, width, height)
  183. {
  184.     int pos;
  185.     register tx, ty;
  186.     register endx, endy;
  187.  
  188.     endy = y+height;
  189.     endx = x+width;
  190.     if (y < TOPSPACE-64) {
  191.     redraw_message(1);
  192.     y = TOPSPACE-64;
  193.     }
  194.     if (endy >= TOPSPACE+64*9) {
  195.     redraw_message(2);
  196.     endy = TOPSPACE+64*9;
  197.     }
  198.     /* WARNING! Magic numbers present! */
  199.     endy = (endy-18+63 & ~63) + 18;
  200.     endx = (endx+63) & ~63;
  201.     if (y < TOPSPACE) {        /* Do captured pieces */
  202.     tx = (x+width+31) / 32;
  203.     for(ty = (x / 64) * 2; ty < tx; ty += 2)
  204.         redraw_captured(reverse ? ty + 16 : ty);
  205.     for(ty = x < 32 ? 1 : x / 32 - 1 | 1; ty < tx; ty += 2)
  206.         redraw_captured(reverse ? ty + 16 : ty);
  207.     }
  208.     if (endy > TOPSPACE+64*8) {
  209.     pos = x / 32;
  210.     tx = (x+width+31) / 32;
  211.     for(ty = (x / 64) * 2; ty < tx; ty += 2)
  212.         redraw_captured(reverse ? ty : ty + 16);
  213.     for(ty = x < 32 ? 1 : x / 32 - 1 | 1; ty < tx; ty += 2)
  214.         redraw_captured(reverse ? ty : ty + 16);
  215.     }
  216.     for (ty = y; ty  < endy; ty += 64)
  217.     for (tx = x; tx < endx; tx += 64) {
  218.         pos = xytopos(tx, ty);
  219.         if (pos < 0 || whose[pos] == OFFBOARD)
  220.         continue;
  221.         redraw_pos(pos);
  222.         if (state == PLAYING && ghost[pos])
  223.         redraw_ghost(pos);
  224.         else if (whose[pos] == ourcolor ||
  225.         (state != PLAYING && whose[pos] != EMPTY))
  226.             redraw_piece(pos);
  227.     }
  228. }
  229.  
  230. redraw_pos(pos)
  231. {
  232.     int x, y;
  233.     Pixmap tile;
  234.  
  235.     if (reverse) {
  236.     x = 8-pos%10;
  237.     y = 8-pos/10;
  238.     } else {
  239.     x = pos%10-1;
  240.     y = pos/10-1;
  241.     }
  242.     if (whose[pos] == OFFBOARD) {    /* Captured area */
  243.     XPixSet(window, x*64+1, y*64+1+TOPSPACE, 64, 64, BlackPixel);    
  244.     return;
  245.     }
  246.     if ((x+y) & 1)
  247.     tile = black;
  248.     else
  249.     tile = white;
  250.     XPixmapPut(window, 1, 1, x*64+1, y*64+1+TOPSPACE, 63, 63, tile, GXcopy, 1);
  251. }
  252.  
  253. static struct w {
  254.     int x, y, len;
  255.     char buf[128];
  256. } w[] =
  257. {   { 0, 0,            48},    /* MESSAGE */
  258.     { 0, 64*9+1+TOPSPACE,    48},    /* CHECK */
  259.     { 0, 64*9+1+TOPSPACE+18,    24},    /* LEGAL */
  260.     { 64*4,64*9+1+TOPSPACE+18,    24},    /* CAPTURE */
  261.     { 0, 64*9+1+TOPSPACE+18*2,    24},    /* TOMOVE */
  262.     { 64*4,64*9+1+TOPSPACE+18*2, 24},    /* PAWNTRIES */
  263. };
  264.  
  265. message(line, where)
  266. char *line;
  267. {
  268.     char blank[80];
  269.  
  270.     strncpy(blank, line, sizeof blank);
  271.     line = blank + strlen(blank);
  272.     while (line < &blank[sizeof blank])
  273.     *line++ = ' ';
  274.     *--line = '\0';
  275.     strcpy(w[where].buf, blank);
  276.     XText(window, w[where].x, w[where].y, blank, w[where].len,
  277.     font, WhitePixel, BlackPixel);
  278. }
  279.  
  280. mclear(where)
  281. {
  282.     char blank[80];
  283.     char *cp = blank;
  284.  
  285.     while (cp < &blank[sizeof blank])
  286.     *cp++ = ' ';
  287.     *--cp = '\0';
  288.     strcpy(w[where].buf, blank);
  289.     XText(window, w[where].x, w[where].y, blank, w[where].len,
  290.     font, WhitePixel, BlackPixel);
  291. }
  292.  
  293. /* which is 0 for all, 1 for stuff on top, and 2 for messages on bottom */
  294. redraw_message(which)
  295. {
  296.     register struct w *m;
  297.  
  298.     if (which)
  299.     switch (which) {
  300.         case 1:
  301.         m = w;
  302.         XText(window, m->x, m->y, m->buf, m->len,
  303.             font, WhitePixel, BlackPixel);
  304.         return;
  305.         case 2:
  306.         for (m = &w[1]; m < &w[sizeof w / sizeof (struct w)]; m++)
  307.             XText(window, m->x, m->y, m->buf, m->len,
  308.             font, WhitePixel, BlackPixel);
  309.         return;
  310.     }
  311.     for (m = w; m < &w[sizeof w / sizeof (struct w)]; m++) {
  312.     XText(window, m->x, m->y, m->buf, m->len,
  313.         font, WhitePixel, BlackPixel);
  314.     }
  315. }
  316.  
  317. static char *nextchar;
  318. #define start_char (&w[MESSAGE].buf[9])
  319. #define end_char (&w[MESSAGE].buf[sizeof (w[MESSAGE].buf) - 1])
  320.  
  321. start_note()
  322. {
  323.     message("Message:", MESSAGE);
  324.     nextchar = start_char;
  325. }
  326.  
  327. do_note(s, n)
  328. char *s;
  329. {
  330.     char c;
  331.  
  332.     while (n-- > 0) {
  333.     switch(*s) {
  334.         case '\b':
  335.         case '\0177':    /* DELETE */
  336.         if (nextchar > start_char) {
  337.             nextchar--;
  338.             put_char(' ');
  339.         }
  340.         break;
  341.  
  342.         case '\027':        /* Control-W */
  343.         c = *nextchar;
  344.         while (nextchar > start_char && c == ' ') {
  345.             c = *nextchar--;
  346.             put_char(' ');
  347.         }
  348.         while (nextchar > start_char && c != ' ') {
  349.             c = *nextchar--;
  350.             put_char(' ');
  351.         }
  352.         break;
  353.  
  354.         case '\030':    /* control-X */
  355.         case '\025':    /* control-U */
  356.         while (nextchar > start_char) {
  357.             nextchar--;
  358.             put_char(' ');
  359.         }
  360.         break;
  361.  
  362.         case '\n':
  363.         case '\r':
  364.         *nextchar = '\0';
  365.         fprintf(out, "say %s\r\n", start_char);
  366.         return TRUE;
  367.  
  368.         case '\t':        /* Tab */
  369.         *s = ' ';
  370.         /* FALLTHROUGH */
  371.         default:
  372.         if (*s < ' ')
  373.             continue;
  374.         if (nextchar >= end_char)
  375.             continue;
  376.         put_char(*s);
  377.         *nextchar++ = *s;
  378.         break;
  379.  
  380.     }
  381.     s++;
  382.     }
  383.     return FALSE;
  384. }
  385.  
  386. put_char(c)
  387. char c;
  388. {
  389.     register struct w *m = &w[MESSAGE];
  390.     int x;
  391.  
  392.     *nextchar = '\0';
  393.     x = XStringWidth(m->buf, &info, 0, 0);
  394.     XText(window, m->x+x, m->y, &c, 1, font, WhitePixel, BlackPixel);
  395. }
  396.  
  397. refresh()
  398. {
  399.     XFlush();
  400. }
  401.